package ru.p03.tvipuskeditor.client.tvipuskeditor;

import java.util.ArrayList;
import java.util.List;

import com.bfr.client.selection.Range;
import com.google.gwt.core.client.GWT;

public class EditorTextScanner {

	private int offset = 0; //позиция начала текста (без самого тега)
	
	private int length_tag = 0; //длина тега
	
	private String text;
	
	List<Block>listBlock = new ArrayList<Block>();

	public void setText(String text) {
		this.text = text;
	}

	public EditorTextScanner() {
		super();
	}
	
	public EditorTextScanner(String text) {
		super();
		this.text = text;
	}

	public int getOffset() {
		return this.offset;
	}
	public int getLengthTag() {
		return this.length_tag;
	}
	
	public void first(){
		this.offset = 0;
	}
	
	private String maxBlockId = "0";
	
	public Block getNextBlock () throws Exception{

		if( (text == null) || ("".equals(text))){
			return null;
		}

		int indStartBraces = text.indexOf("{",offset);
		if (indStartBraces < 0){
			return null;
		}

		int indEndBraces = text.indexOf("}",indStartBraces);
		if (indEndBraces < 0){
			return null;
		}

		int lenTag = indEndBraces - indStartBraces;

//		if( (lenTag < 5) || (lenTag > 7)){
//			return null;
//		}
		if(lenTag < 4){
			return null;
		}

//		String tag = text.substring(indStartBraces+1, indStartBraces + 4);
//
//		if(! ( (tag.equals(VTvipuskEditor.ZKD_TEXT)) || (tag.equals(VTvipuskEditor.SNH_TEXT)) 
//				|| (tag.equals(VTvipuskEditor.SKL_TEXT))) ){
//			return null;
//		}

		//String id_tag = text.substring(indStartBraces + 4,indStartBraces + lenTag );
		
//		char c = text.charAt(indStartBraces + 4);
//		StringBuilder id_tag_builder = new StringBuilder(); 
//		for(int i=1; ((c >= '0') && (c <= '9')); i++) {
//			id_tag_builder.append(c);
//			c = text.charAt(indStartBraces + 4 + i);
//		}

//		String id_tag = id_tag_builder.toString();
//		if ((id_tag == null) || (id_tag.equals(""))){
//			return null;
//		}
		Block block = parseTagAttrs(text.substring(indStartBraces, indEndBraces+1));

		this.length_tag = lenTag;
		this.offset = indEndBraces + 1;

		return block;
//		Block block = findInList(id_tag);
//		if(Integer.parseInt(id_tag) > Integer.parseInt(maxBlockId)){
//			maxBlockId = id_tag;
//		}
//		
//		if (block != null)
//			return block;
//		else{
//			block = createBlock(id_tag, tag);
//			return block;
//		}
		
//		if( (text == null) || ("".equals(text))){
//			return null;
//		}
//
//		int indStartBraces = text.indexOf("{",offset);
//		if (indStartBraces < 0){
//			return null;
//		}
//
//		int indEndBraces = text.indexOf("}",indStartBraces);
//		if (indEndBraces < 0){
//			return null;
//		}
//
//		int lenTag = indEndBraces - indStartBraces;
//
////		if( (lenTag < 5) || (lenTag > 7)){
////			return null;
////		}
//		if(lenTag < 5){
//			return null;
//		}
//
//		String tag = text.substring(indStartBraces+1, indStartBraces + 4);
//
//		if(! ( (tag.equals(VTvipuskEditor.ZKD_TEXT)) || (tag.equals(VTvipuskEditor.SNH_TEXT)) 
//				|| (tag.equals(VTvipuskEditor.SKL_TEXT))) ){
//			return null;
//		}
//
//		//String id_tag = text.substring(indStartBraces + 4,indStartBraces + lenTag );
//		
//		char c = text.charAt(indStartBraces + 4);
//		StringBuilder id_tag_builder = new StringBuilder(); 
//		for(int i=1; ((c >= '0') && (c <= '9')); i++) {
//			id_tag_builder.append(c);
//			c = text.charAt(indStartBraces + 4 + i);
//		}
//
//		String id_tag = id_tag_builder.toString();
//		if ((id_tag == null) || (id_tag.equals(""))){
//			return null;
//		}
//
//
//		this.length_tag = lenTag;
//		this.offset = indEndBraces + 1;
//
//
//		Block block = findInList(id_tag);
//		if(Integer.parseInt(id_tag) > Integer.parseInt(maxBlockId)){
//			maxBlockId = id_tag;
//		}
//		
//		if (block != null)
//			return block;
//		else{
//			block = createBlock(id_tag, tag);
//			return block;
//		}
//		
	}
	/**
	 * парсим атрибуты тега
	 * члены объекта класса не меняет - можно вызывать из др. класса
	 * @throws Exception 
	 */
	public Block parseTagAttrs(String tag_text) throws Exception{
		Block block = new Block();
		
		if ("".equals(tag_text))
			throw new Exception("Тег пуст");
		if (tag_text.length() < 5)
			throw new Exception("Маленькая длина для тега");
		
		int ind_start = tag_text.indexOf('{');
		if (ind_start < 0)
			throw new Exception("Не найдена скобка : {");
		String tag_type = tag_text.substring(ind_start+1, ind_start + 4);
		
		block.setBlockAtrType(tag_type);
		if (TvipuskEditorWidget.ZKD_TEXT.equals(tag_type)){ //Тип тега ЗКД- выходим, для СНХ и СКЛ продолжаем
			 return block;
		}
		//Продолжаем разбор тега СНХ
		ind_start = tag_text.indexOf("С='",ind_start);
		if (ind_start < 0)
			throw new Exception("Не найден текст: С='");
		int ind_end = tag_text.indexOf("'",ind_start + 3);
		if (ind_end < 0)
			throw new Exception("Не найдена закрывающая кавычка");
		String time_s = tag_text.substring(ind_start + 3, ind_end);
		
		
		ind_start = tag_text.indexOf("По='", ind_end);
		if (ind_start < 0)
			throw new Exception("Не найден текст: По='");			
		ind_end = tag_text.indexOf("'", ind_start + 4);
		if (ind_end < 0)
			throw new Exception("Не найдена закрывающая кавычка");
		String time_po = tag_text.substring(ind_start + 4, ind_end);
		
		
		ind_start = tag_text.indexOf("Файл='",ind_end);
		if (ind_start < 0)
			throw new Exception("Не найден текст: Файл='");
		ind_end = tag_text.indexOf("'", ind_start + 6);
		if (ind_end < 0)
			throw new Exception("Не найдена закрывающая кавычка");
		String file_name = tag_text.substring(ind_start + 6, ind_end);

		
		ind_start = tag_text.indexOf("Длительность='",ind_end);
		if (ind_start < 0)
			throw new Exception("Не найден текст: Длительность='");
		ind_end = tag_text.indexOf("'", ind_start + 14);
		if (ind_end < 0)
			throw new Exception("Не найдена закрывающая кавычка");
		String file_duration = tag_text.substring(ind_start + 14, ind_end);

		ind_start = tag_text.indexOf("Титр='",ind_end);
		if (ind_start < 0)
			throw new Exception("Не найден текст: Титр='");
		ind_end = tag_text.indexOf("'", ind_start + 6);
		if (ind_end < 0)
			throw new Exception("Не найдена закрывающая кавычка");
		String tag_title = tag_text.substring(ind_start + 6, ind_end);

		block.setBlockAtrTitle(tag_title);
		block.setDuration(file_duration);
		block.setFileName(file_name);
		block.setPo(time_po);
		block.setS(time_s);

		return block;
	}	

	private Block findInList(String id) {
		for(Block block : listBlock){
			if (id.equals(block.getId())){
				return block;
			}
		}
		return null;
	}

	public Block createBlock(String id, String typeBlock){
		
		if( (id == null) || "".equals(id) ){
			//генерируем новый id
			maxBlockId = "" + (Integer.parseInt(maxBlockId) + 1);
			id = maxBlockId; 
		}
//		else{
//			if(Integer.parseInt(id) > Integer.parseInt(maxBlockId)){
//				maxBlockId = id;
//			}
//		}
		Block block = new Block(id, typeBlock);
		listBlock.add(block);

		return block;
	}
	/**
	 * Получает текст из блоков и расставляет теги-фигурные скобки
	 * При этом очищается и заново заполняется коллекция listBlock
	 * 
	 * @param rootBlock
	 * @return
	 */
    public String getFormattedTextFromBlock(Block rootBlock){
    	StringBuilder textBuilder = new StringBuilder();
    	textBuilder.append(rootBlock.getText());
    	for(Block block : rootBlock.getBlocks()){
              textBuilder.append( '{' );
              textBuilder.append( block.getBlockAtrType() );
              if (TvipuskEditorWidget.SNH_TEXT.equals(block.getBlockAtrType())){
            	  textBuilder.append(" "); 
            	  textBuilder.append( getTagAttrsFromFields(block) );  
              }
              
              textBuilder.append( '}' );
              textBuilder.append( block.getText() );
//              listBlock.add(block);
              for(Block subBlock : block.getBlocks()){
                      textBuilder.append( '{' );
                      textBuilder.append( TvipuskEditorWidget.SKL_TEXT );
	          		  String attrs = getTagAttrsFromFields(subBlock);
	          		  if(!attrs.equals("")){
	          			  textBuilder.append(" " +  attrs );
	          		  }                        
                      textBuilder.append( '}' );
                      textBuilder.append( subBlock.getText() );
//                      listBlock.add(subBlock);
              }
    	}
//    	listBlock.clear();
    	
//        StringBuilder textBuilder = new StringBuilder();
//        for(Block block : rootBlock.getBlocks()){
//                textBuilder.append( '{' );
//                textBuilder.append( block.getBlockAtrType() );
//                textBuilder.append( block.getId() );
//                
//    			String attrs = BlockFactory.getAttributesLine(block);
//    			if(!attrs.equals("")){
//    				textBuilder.append(" " +  attrs );
//    			}
//                
//                textBuilder.append( '}' );
//                textBuilder.append( block.getText() );
//                listBlock.add(block);
//                for(Block subBlock : block.getBlocks()){
//                        textBuilder.append( '{' );
//                        textBuilder.append( VTvipuskEditor.SKL_TEXT );
//                        textBuilder.append( subBlock.getId() );
//            			attrs = BlockFactory.getAttributesLine(subBlock);
//            			if(!attrs.equals("")){
//            				textBuilder.append(" " +  attrs );
//            			}                        
//                        textBuilder.append( '}' );
//                        textBuilder.append( subBlock.getText() );
//                        listBlock.add(subBlock);
//                }
//        }
        return textBuilder.toString();
    }
	/**
	 * Формирует строку атрибутов блока
	 * @return
	 */	
	protected String getTagAttrsFromFields(Block block){
		StringBuilder sb = new StringBuilder();
		sb.append("С='");
		sb.append(block.getS());
		sb.append("'");
		sb.append(" По='");
		sb.append(block.getPo());
		sb.append("'");
		sb.append(" Файл='");
		sb.append(block.getFileName());
		sb.append("'");
		sb.append(" Длительность='");
		sb.append(block.getDuration());
		sb.append("'");
		sb.append(" Титр='");
		sb.append(block.getBlockAtrTitle());
		sb.append("'");
		return sb.toString();
	}
    
	
}
